//
//  WTUserCenter.m
//  UIViewTransformPoint
//
//  Created by codew on 5/9/21.
//

#import "WTUserCenter.h"
#import "WTUserTest.h"
#import <objc/runtime.h>

@interface WTUserCenter ()


@end

@implementation WTUserCenter

//- (BOOL)isEqual:(id)object
//{
//    NSLog(@"%@", object);
//    NSLog(@"吃饭没?");
//    return YES;
//}

//- (instancetype)init
//{
//    NSLog(@"🙂%s", __func__);
//    return self;
//}
//- (void)test
//{
//    NSLog(@"🙂%s", __func__);
//}

///**
// 类方法调用
// */
//+ (BOOL)resolveClassMethod:(SEL)sel
//{
//    
//    return YES;
//}
//


void cctv(void)
{
    
    NSLog(@"🙂%s", __func__);
}
/**
 实例方法调用
 sel : 方法选择器

 返回YES: 消息已处理, 结束消息转发流程
 返回NO: 系统给我们第二次机会⏬ forwardingTargetForSelector
 */
+ (BOOL)resolveInstanceMethod:(SEL)sel{
    

    if (sel == @selector(test)) {
        
        NSLog(@"🙂%s", __func__);
        
        
        
        class_addMethod(self, @selector(test), cctv, "v@:");
        return NO;
    }else{
        
        return [super resolveInstanceMethod:sel];
    }
}

/**
 第二次机会正是在下

 id: 返回一个对象, 这个对象处理本次的方法选择器SEL

 返回一个对象: 消息已处理, 转发目标处理,
 返回nil: 系统给我们第三次机会 ⏬ methodSignatureForSelector
 */
- (id)forwardingTargetForSelector:(SEL)aSelector
{
    
    NSLog(@"🙂%s", __func__);
    return nil;//[WTUserTest new];
}

/**
 第三次机会正是在下

 NSMethodSignature类型: 是对方法选择器的返回值类型, 以及参数个数,以及参数类型的封装, 就是方法签名

 返回一个方法签名: 系统就调用forwardInvocation, 如果forwardInvocation能够处理的话, 消息转发流程就结束
 返回nil: 消息无法处理
 */
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    
    if (aSelector == @selector(test)) {

        // v 代表返回值void类型
        // @ 代表第一个参数类型是id, 即self
        // : 代表第二个参数是SEL类型 即@selector(test)
        NSLog(@"🙂%s", __func__);
        return [NSMethodSignature signatureWithObjCTypes:"v@:"];
    }else{

        return [super methodSignatureForSelector:aSelector];
    }
    
    return nil;
    
}

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    NSLog(@"🙂%s", __func__);
}

@end
